package org.it3.Dominio;

import java.util.Date;
import java.util.Vector;

import org.it3.Dominio.UsuarioBD;
import org.it3.Control.DBResource;
import org.it3.Control.ResourceType;
import org.it3.Control.InterfaceAgent;
import org.it3.Control.SingletonAgent;

public class TareaBDManager {
    //Metodo para realizar una insercion en la base de datos
    public static Vector<TareaBD> search(BusquedaTarea busquedaTarea) {
    	try {
	    	InterfaceAgent agent = SingletonAgent.getAgent();
	    	
			String sql = "SELECT idrecordatorios FROM recordatorios WHERE ";
			
			// obtenemos aquellos campos que nos interesan
			Vector<String> sentencias = new Vector<String>();
			Vector<DBResource> resouceListIn = new Vector<DBResource>();
			
			if ( busquedaTarea.getAutor() != null ) {
				sentencias.add("idusuarios = ?");
				resouceListIn.add( new DBResource( ResourceType.INT, busquedaTarea.getAutor().getId() ) );
			}
			
			if ( busquedaTarea.getFechaIntervaloInicio() != null ) {
				sentencias.add("fechaLimite >= ?");
				resouceListIn.add( new DBResource( ResourceType.DATE, busquedaTarea.getFechaIntervaloInicio() ) );
			}
			
			if ( busquedaTarea.getFechaIntervaloFinal() != null ) {
				sentencias.add("fechaLimite <= ?");
				resouceListIn.add( new DBResource( ResourceType.DATE, busquedaTarea.getFechaIntervaloFinal() ) );
			}
			
			if ( busquedaTarea.getCompletada() != null ) {
				sentencias.add("completado <= ?");
				resouceListIn.add( new DBResource( ResourceType.BOOLEAN, busquedaTarea.getCompletada() ) );
			}
			
			// los juntamos 
			int l = sentencias.size();
			if ( l > 0 ) {
				sql += sentencias.firstElement();
				
				for ( int i = 1; i < l ; i++ ) {
					sql += "AND " + sentencias.get(i);
				}
				
				sql += ";";
			}
			
			Vector<DBResource> resouceListOut = new Vector<DBResource>();
			resouceListOut.add( new DBResource(ResourceType.INT) );
	    	
			// realizamos la consulta
			Vector<Vector<Object>> res = agent.read( sql, resouceListIn, resouceListOut );
			
			Vector<TareaBD> resultado = new Vector<TareaBD>();
			for ( Vector<Object> v : res ) {
				int index = (Integer) v.get(0);
				
				TareaBD tareaBD = new TareaBD();
				tareaBD.setId(index);
				if ( !tareaBD.read() ) return new Vector<TareaBD>();
				resultado.add(tareaBD);
			}
			
			return resultado;
    	} catch ( Exception e) {
    		int sd = 0;
    	}
    	
    	return new Vector<TareaBD>();
    }
    
    public boolean read(TareaBD tareaBD) {
    	try {
			InterfaceAgent agent = SingletonAgent.getAgent();
			
			String sql = "SELECT * FROM recordatorios WHERE "
							+ "idrecordatorios = ?;";
			
			Vector<DBResource> resouceListIn = new Vector<DBResource>();
			resouceListIn.add( new DBResource(ResourceType.STRING, tareaBD.getId())) ;
			
			Vector<DBResource> resouceListOut = new Vector<DBResource>();
			resouceListOut.add( new DBResource(ResourceType.INT) );
			resouceListOut.add( new DBResource(ResourceType.STRING) );
			resouceListOut.add( new DBResource(ResourceType.BOOLEAN) );
			resouceListOut.add( new DBResource(ResourceType.DATE) );
			resouceListOut.add( new DBResource(ResourceType.DATE) );
			resouceListOut.add( new DBResource(ResourceType.INT) );

			Vector<Vector<Object>> res = agent.read( sql, resouceListIn, resouceListOut );
			
			boolean autenticado = res.size() > 0;
			if ( autenticado ) {
				tareaBD.setId( (Integer) res.get(0).get(0) );
				tareaBD.setNombre( (String) res.get(0).get(1) );
				tareaBD.setCompletada( (Boolean) res.get(0).get(2) );
				tareaBD.setFechaFin( (Date) res.get(0).get(3) );
				tareaBD.setFechaInicio( (Date) res.get(0).get(4) );
				AutorBD myAutor = new AutorBD();
				myAutor.setId((Integer) res.get(0).get(5));
				myAutor.read();
				tareaBD.setAutorBD(myAutor);
			}
			
			return autenticado;
    	} catch ( Exception e) {
    		int n = 11;
    	}
    	
    	return false;
    }
    
	public boolean insert(TareaBD tarea) {
		try {
			InterfaceAgent agent = SingletonAgent.getAgent();
	
	        String sql = "INSERT INTO recordatorios( titulo, completado, fechaLimite, fechaCreada, idusuarios) VALUES ( ?, ?, ?, ?, ?);";
	
	        Vector<DBResource> resourceList= new Vector<DBResource>();
	        resourceList.add(new DBResource(ResourceType.STRING, tarea.getNombre()));
	        resourceList.add(new DBResource(ResourceType.BOOLEAN, tarea.isCompletada()));
	        resourceList.add(new DBResource(ResourceType.DATE, tarea.getFechaFin()));
	        resourceList.add(new DBResource(ResourceType.DATE, tarea.getFechaInicio()));
	        resourceList.add(new DBResource(ResourceType.INT, tarea.getAutorBD().getId()));
	
	        int res = agent.modifyWithID(sql, resourceList);
	        tarea.setId(res);
	
	        if (res != -1){
	            return true;
	        }
	    } catch ( Exception e) {
	        int sd = 0;
	    }
	
	    return false;
	}

    //Metodo para realizar una eliminacion en la base de datos
    public boolean delete(TareaBD tarea) {
    	try {
	    	InterfaceAgent agent = SingletonAgent.getAgent();
	    	String sql = "DELETE FROM recordatorios WHERE idrecordatorios = ? ;";
	    	
	    	Vector<DBResource> resouceList= new Vector<DBResource>();
	    	resouceList.add( new DBResource( ResourceType.INT, tarea.getId() ) );
	    	
	    	return 1 == agent.modify(sql, resouceList);
    	} catch ( Exception e) {
    		
    	}
    	
    	return false;
    }
}
